home *** CD-ROM | disk | FTP | other *** search
/ InterCD 2001 May / may_2001.iso / intercd / root / Multimedia / ^DivX_Article / virtualdub / VirtualDub-source-1_4d / a_convert.asm < prev    next >
Encoding:
Assembly Source File  |  2001-03-20  |  12.5 KB  |  797 lines

  1. ;    VirtualDub - Video processing and capture application
  2. ;    Copyright (C) 1998-2001 Avery Lee
  3. ;
  4. ;    This program is free software; you can redistribute it and/or modify
  5. ;    it under the terms of the GNU General Public License as published by
  6. ;    the Free Software Foundation; either version 2 of the License, or
  7. ;    (at your option) any later version.
  8. ;
  9. ;    This program is distributed in the hope that it will be useful,
  10. ;    but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. ;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12. ;    GNU General Public License for more details.
  13. ;
  14. ;    You should have received a copy of the GNU General Public License
  15. ;    along with this program; if not, write to the Free Software
  16. ;    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  17.  
  18.     .586
  19.     .mmx
  20.     .model    flat
  21.     .code
  22.  
  23.     extern _MMX_enabled : byte
  24.  
  25.     public    _DIBconvert_8_to_16
  26.     public    _DIBconvert_8_to_24
  27.     public    _DIBconvert_8_to_32
  28.     public    _DIBconvert_16_to_32
  29.     public    _DIBconvert_24_to_32
  30.     public    _DIBconvert_16_to_24
  31.     public    _DIBconvert_24_to_24
  32.     public    _DIBconvert_16_to_16
  33.     public    _DIBconvert_24_to_16
  34.  
  35.  
  36.  
  37. ; void DIBconvert_8_to_32(
  38. ;    void *dest,        [ESP+ 4]
  39. ;    ulong dest_pitch,    [ESP+ 8]
  40. ;    void *src,        [ESP+12]
  41. ;    ulong src_pitch,    [ESP+16]
  42. ;    ulong width,        [ESP+20]
  43. ;    ulong height,        [ESP+24]
  44. ;    ulong *palette);    [ESP+28]
  45.  
  46. _DIBconvert_8_to_32:
  47.     push    ebp
  48.     push    edi
  49.     push    esi
  50.     push    edx
  51.     push    ecx
  52.     push    ebx
  53.     push    eax
  54.  
  55.     mov    esi,[esp+12+28]
  56.     mov    edi,[esp+4+28]
  57.  
  58.     mov    eax,[esp+20+28]
  59.     mov    ebx,eax
  60.     shl    ebx,2
  61.     mov    edx,[esp+28+28]
  62.     mov    ecx,[esp+24+28]
  63.  
  64.     sub    [esp+16+28],eax
  65.     sub    [esp+8+28],ebx
  66.  
  67. DIBconvert832@y:
  68.     mov    ebp,[esp+20+28]
  69.     xor    eax,eax
  70. DIBconvert832@x:
  71.     mov    al,[esi]
  72.     inc    esi
  73.     mov    ebx,[eax*4+edx]    
  74.     mov    [edi],ebx
  75.     add    edi,4
  76.     dec    ebp
  77.     jne    DIBconvert832@x
  78.  
  79.     add    esi,[esp+16+28]
  80.     add    edi,[esp+8+28]
  81.  
  82.     dec    ecx
  83.     jne    DIBconvert832@y
  84.  
  85.     pop    eax
  86.     pop    ebx
  87.     pop    ecx
  88.     pop    edx
  89.     pop    esi
  90.     pop    edi
  91.     pop    ebp
  92.  
  93.     ret
  94.  
  95. ; void DIBconvert_8_to_24(
  96. ;    void *dest,        [ESP+ 4]
  97. ;    ulong dest_pitch,    [ESP+ 8]
  98. ;    void *src,        [ESP+12]
  99. ;    ulong src_pitch,    [ESP+16]
  100. ;    ulong width,        [ESP+20]
  101. ;    ulong height,        [ESP+24]
  102. ;    ulong *palette);    [ESP+28]
  103.  
  104. _DIBconvert_8_to_24:
  105.     push    ebp
  106.     push    edi
  107.     push    esi
  108.     push    edx
  109.     push    ecx
  110.     push    ebx
  111.     push    eax
  112.  
  113.     mov    esi,[esp+12+28]
  114.     mov    edi,[esp+4+28]
  115.  
  116.     mov    eax,[esp+20+28]
  117.     mov    ebx,eax
  118.     lea    ebx,[ebx+eax*2]
  119.     mov    edx,[esp+28+28]
  120.     mov    ecx,[esp+24+28]
  121.  
  122.     sub    [esp+16+28],eax
  123.     sub    [esp+8+28],ebx
  124.  
  125. DIBconvert824@y:
  126.     mov    ebp,[esp+20+28]
  127.     xor    eax,eax
  128. DIBconvert824@x:
  129.     mov    al,[esi]
  130.     inc    esi
  131.     mov    ebx,[eax*4+edx]    
  132.     mov    [edi],ebx
  133.     add    edi,3
  134.     dec    ebp
  135.     jne    DIBconvert824@x
  136.  
  137.     add    esi,[esp+16+28]
  138.     add    edi,[esp+8+28]
  139.  
  140.     dec    ecx
  141.     jne    DIBconvert824@y
  142.  
  143.     pop    eax
  144.     pop    ebx
  145.     pop    ecx
  146.     pop    edx
  147.     pop    esi
  148.     pop    edi
  149.     pop    ebp
  150.  
  151.     ret
  152.  
  153. ;******************************************************
  154. ;
  155. ; void DIBconvert_8_to_16(
  156. ;    void *dest,        [ESP+ 4]
  157. ;    ulong dest_pitch,    [ESP+ 8]
  158. ;    void *src,        [ESP+12]
  159. ;    ulong src_pitch,    [ESP+16]
  160. ;    ulong width,        [ESP+20]
  161. ;    ulong height,        [ESP+24]
  162. ;    ulong *palette);    [ESP+28]
  163. ;
  164. ; This implementation is painfully bad, but it's not really
  165. ; worth optimizing much...
  166.  
  167. _DIBconvert_8_to_16:
  168.     push    ebp
  169.     push    edi
  170.     push    esi
  171.     push    edx
  172.     push    ecx
  173.     push    ebx
  174.     push    eax
  175.  
  176.     mov    esi,[esp+12+28]
  177.     mov    edi,[esp+4+28]
  178.  
  179.     mov    ebp,[esp+20+28]
  180.     lea    eax,[ebp+ebp]
  181.     sub    [esp+8+28],eax
  182.     sub    [esp+16+28],ebp
  183.  
  184.     mov    edx,[esp+24+28]
  185. DIBconvert816@y:
  186.     mov    ebp,[esp+20+28]
  187.     push    ebp
  188.     push    edx
  189.     shr    ebp,1
  190.     jz    DIBconvert816@x2
  191. DIBconvert816@x:
  192.     xor    eax,eax            ;u
  193.     mov    ebx,[esp+28+36]        ;v
  194.     mov    al,[esi+1]        ;u
  195.     add    esi,2            ;v
  196.     mov    eax,[ebx+eax*4]        ;u [AGI]
  197.  
  198.     mov    ebx,eax            ;u
  199.     mov    ecx,eax            ;v
  200.     shr    ebx,3            ;u
  201.     and    ecx,0000f800h        ;v
  202.     shr    eax,9            ;u
  203.     and    ebx,0000001fh        ;v
  204.     shr    ecx,6            ;u
  205.     and    eax,00007c00h        ;v
  206.     or    ebx,ecx            ;u
  207.     add    edi,4            ;v
  208.     or    ebx,eax            ;u
  209.  
  210.     xor    ecx,ecx            ;v
  211.     mov    eax,[esp+28+36]        ;u
  212.     mov    cl,[esi-2]        ;v
  213.     mov    edx,ebx            ;u
  214.     mov    ecx,[eax+ecx*4]        ;v [AGI]
  215.     mov    eax,ecx            ;u
  216.  
  217.     shl    edx,16            ;u
  218.     mov    ebx,ecx            ;v
  219.     shr    ebx,3            ;u
  220.     and    ecx,0000f800h        ;v
  221.     shr    eax,9            ;u
  222.     and    ebx,0000001fh        ;v
  223.     shr    ecx,6            ;u
  224.     and    eax,00007c00h        ;v
  225.     or    eax,ecx            ;u
  226.     or    edx,ebx            ;v
  227.     or    edx,eax            ;u
  228.     dec    ebp            ;v
  229.     mov    [edi-4],edx        ;u
  230.     jne    DIBconvert816@x        ;v
  231. DIBconvert816@x2:
  232.     pop    edx
  233.     pop    ebp
  234.     and    ebp,1
  235.     jz    DIBconvert816@x3
  236.     xor    eax,eax
  237.     mov    ecx,[esp+28+28]
  238.     mov    al,[esi]
  239.     mov    eax,[eax*4+ecx]
  240.     inc    esi
  241.  
  242.     mov    ebx,eax
  243.     mov    ecx,eax
  244.     shr    ebx,3
  245.     and    ecx,0000f800h
  246.     shr    eax,9
  247.     and    ebx,0000001fh
  248.     shr    ecx,6
  249.     and    eax,00007c00h
  250.     or    ebx,ecx
  251.     or    ebx,eax
  252.     mov    [edi+0],bl
  253.     mov    [edi+1],bh
  254.     add    edi,2
  255. DIBconvert816@x3:
  256.  
  257.     add    esi,[esp+16+28]
  258.     add    edi,[esp+ 8+28]
  259.  
  260.     dec    edx
  261.     jne    DIBconvert816@y
  262.  
  263.     pop    eax
  264.     pop    ebx
  265.     pop    ecx
  266.     pop    edx
  267.     pop    esi
  268.     pop    edi
  269.     pop    ebp
  270.  
  271.     ret
  272.  
  273. ; void DIBconvert_16_to_32(
  274. ;    void *dest,        [ESP+ 4]
  275. ;    ulong dest_pitch,    [ESP+ 8]
  276. ;    void *src,        [ESP+12]
  277. ;    ulong src_pitch,    [ESP+16]
  278. ;    ulong width,        [ESP+20]
  279. ;    ulong height);        [ESP+24]
  280.  
  281. _DIBconvert_16_to_32:
  282.     push    ebp
  283.     push    edi
  284.     push    esi
  285.     push    edx
  286.     push    ecx
  287.     push    ebx
  288.     push    eax
  289.  
  290.     mov    esi,[esp+12+28]
  291.     mov    edi,[esp+4+28]
  292.  
  293.     mov    ebp,[esp+20+28]
  294.     lea    eax,[ebp*4]
  295.     lea    ebx,[ebp*2]
  296.     sub    [esp+8+28],eax
  297.     sub    [esp+16+28],ebx
  298.  
  299.     mov    edx,[esp+24+28]
  300. DIBconvert1632@y:
  301.     mov    ebp,[esp+20+28]
  302.     push    ebp
  303.     push    edx
  304.     shr    ebp,1
  305.     jz    DIBconvert1632@x2
  306. DIBconvert1632@x:
  307.     mov    eax,[esi]
  308.     add    esi,4
  309.     mov    edx,eax
  310.     add    edi,8
  311.     mov    ebx,eax
  312.     mov    ecx,eax
  313.     shl    ebx,9
  314.     and    eax,0000001fh
  315.     shl    ecx,6
  316.     and    ebx,00f80000h
  317.     shl    eax,3
  318.     and    ecx,0000f800h
  319.     or    ebx,ecx
  320.     mov    ecx,edx
  321.     or    eax,ebx
  322.     mov    ebx,edx
  323.     shr    ebx,7
  324.     and    edx,001f0000h
  325.     shr    ecx,10
  326.     and    ebx,00f80000h
  327.     shr    edx,13
  328.     and    ecx,0000f800h
  329.     or    ebx,ecx
  330.     mov    [edi-8],eax
  331.     or    edx,ebx
  332.     dec    ebp
  333.     mov    [edi-4],edx
  334.     jne    DIBconvert1632@x
  335. DIBconvert1632@x2:
  336.     pop    edx
  337.     pop    ebp
  338.     and    ebp,1
  339.     jz    DIBconvert1632@x3
  340.  
  341.     mov    eax,[esi]
  342.     add    esi,2
  343.  
  344.     mov    ebx,eax
  345.     mov    ecx,eax
  346.     shl    ebx,9
  347.     shl    ecx,6
  348.     shl    eax,3
  349.     and    ebx,00f80000h
  350.     and    ecx,0000f800h
  351.     and    eax,000000f8h
  352.     or    ebx,ecx
  353.     or    eax,ebx
  354.     mov    [edi],eax
  355.     add    edi,4
  356.  
  357. DIBconvert1632@x3:
  358.  
  359.     add    esi,[esp+16+28]
  360.     add    edi,[esp+ 8+28]
  361.  
  362.     dec    edx
  363.     jne    DIBconvert1632@y
  364.  
  365.     pop    eax
  366.     pop    ebx
  367.     pop    ecx
  368.     pop    edx
  369.     pop    esi
  370.     pop    edi
  371.     pop    ebp
  372.  
  373.     ret
  374.  
  375. ;***************************************************
  376. ;
  377. ; void DIBconvert_24_to_32(
  378. ;    void *dest,        [ESP+ 4]
  379. ;    ulong dest_pitch,    [ESP+ 8]
  380. ;    void *src,        [ESP+12]
  381. ;    ulong src_pitch,    [ESP+16]
  382. ;    ulong width,        [ESP+20]
  383. ;    ulong height);        [ESP+24]
  384.  
  385. _DIBconvert_24_to_32:
  386.     push    ebp
  387.     push    edi
  388.     push    esi
  389.     push    edx
  390.     push    ecx
  391.     push    ebx
  392.  
  393.     mov    esi,[esp+12+24]
  394.     mov    edi,[esp+4+24]
  395.  
  396.     mov    ecx,[esp+20+24]
  397.     lea    eax,[ecx+ecx*2]
  398.     lea    ebx,[ecx*4]
  399.     sub    [esp+8+24],ebx
  400.     sub    [esp+16+24],eax
  401.  
  402.     mov    edx,[esp+24+24]
  403. DIBconvert2432@y:
  404.     mov    ebp,[esp+20+24]
  405.     shr    ebp,2
  406.     push    edx
  407.     jz    DIBconvert2432@x2
  408. DIBconvert2432@x1:
  409.  
  410.     mov    eax,[esi]        ;EAX: b1r0g0b0
  411.     mov    ebx,[esi+4]        ;EBX: g2b2r1g1
  412.  
  413.     mov    [edi],eax
  414.     mov    ecx,ebx            ;ECX: g2b2r1g1
  415.  
  416.     shr    eax,24            ;EAX: ------b1
  417.     mov    edx,[esi+8]        ;EDX: r3g3b3r2
  418.  
  419.     shr    ecx,16            ;ECX: ----g2b2
  420.     add    edi,16
  421.  
  422.     shl    ebx,8            ;EBX: b2r1g1--
  423.     add    esi,12
  424.  
  425.     or    eax,ebx            ;EAX: b2r1g1b1
  426.     mov    ebx,edx            ;EBX: r3g3b3r2
  427.  
  428.     shr    ebx,8            ;EBX: --r3g3b3
  429.     mov    [edi+4-16],eax
  430.  
  431.     shl    edx,16            ;EDX: b3r2----
  432.     mov    [edi+12-16],ebx
  433.  
  434.     or    edx,ecx            ;EDX: b3r2g2b2
  435.     dec    ebp
  436.  
  437.     mov    [edi+8-16],edx
  438.     jne    DIBconvert2432@x1
  439.  
  440. DIBconvert2432@x2:
  441.     pop    edx
  442.     mov    ebx,[esp+20+24]
  443.     and    ebx,3
  444.     jz    DIBconvert2432@x4
  445. DIBconvert2432@x3:
  446.     mov    ax,[esi]
  447.     mov    cl,[esi+2]
  448.     mov    [edi],ax
  449.     mov    [edi+2],cl
  450.     add    esi,3
  451.     add    edi,4
  452.     dec    ebx
  453.     jne    DIBconvert2432@x3
  454. DIBconvert2432@x4:
  455.  
  456.     add    esi,[esp+16+24]
  457.     add    edi,[esp+ 8+24]
  458.  
  459.     dec    edx
  460.     jne    DIBconvert2432@y
  461.  
  462.     pop    ebx
  463.     pop    ecx
  464.     pop    edx
  465.     pop    esi
  466.     pop    edi
  467.     pop    ebp
  468.  
  469.     ret
  470.  
  471.  
  472.  
  473. ;****************************************************************************
  474. ;
  475. ; void DIBconvert_16_to_24(
  476. ;    void *dest,        [ESP+ 4]
  477. ;    ulong dest_pitch,    [ESP+ 8]
  478. ;    void *src,        [ESP+12]
  479. ;    ulong src_pitch,    [ESP+16]
  480. ;    ulong width,        [ESP+20]
  481. ;    ulong height);        [ESP+24]
  482.  
  483. _DIBconvert_16_to_24:
  484.     push    ebp
  485.     push    edi
  486.     push    esi
  487.     push    edx
  488.     push    ecx
  489.     push    ebx
  490.     push    eax
  491.  
  492.     mov    esi,[esp+12+28]
  493.     mov    edi,[esp+4+28]
  494.  
  495.     mov    ebp,[esp+20+28]
  496.     mov    eax,ebp
  497.     lea    ebx,[ebp*2]
  498.     add    eax,ebx
  499.     sub    [esp+8+28],eax
  500.     sub    [esp+16+28],ebx
  501.  
  502.     mov    edx,[esp+24+28]
  503. DIBconvert1624@y:
  504.     mov    ebp,[esp+20+28]
  505.     push    ebp
  506.     push    edx
  507.     shr    ebp,1
  508.     jz    DIBconvert1624@x2
  509. DIBconvert1624@x:
  510.     mov    eax,[esi]
  511.     add    esi,4
  512.     mov    edx,eax
  513.     add    edi,6
  514.     mov    ebx,eax
  515.     mov    ecx,eax
  516.     shl    ebx,9
  517.     and    eax,0000001fh
  518.     shl    ecx,6
  519.     and    ebx,00f80000h
  520.     shl    eax,3
  521.     and    ecx,0000f800h
  522.     or    ebx,ecx
  523.     mov    ecx,edx
  524.     or    eax,ebx
  525.     mov    ebx,edx
  526.     shr    ebx,7
  527.     and    edx,001f0000h
  528.     shr    ecx,10
  529.     and    ebx,00f80000h
  530.     shr    edx,13
  531.     and    ecx,0000f800h
  532.     or    ebx,ecx
  533.     mov    [edi-6],eax
  534.     or    edx,ebx
  535.     dec    ebp
  536.     mov    [edi-3],edx
  537.     jne    DIBconvert1624@x
  538. DIBconvert1624@x2:
  539.     pop    edx
  540.     pop    ebp
  541.     and    ebp,1
  542.     jz    DIBconvert1624@x3
  543.  
  544.     mov    eax,[esi]
  545.     add    esi,2
  546.  
  547.     mov    ebx,eax
  548.     mov    ecx,eax
  549.     shl    ebx,9
  550.     shl    ecx,6
  551.     shl    eax,3
  552.     and    ebx,00f80000h
  553.     and    ecx,0000f800h
  554.     and    eax,000000f8h
  555.     or    ebx,ecx
  556.     or    eax,ebx
  557.     mov    [edi],eax
  558.     add    edi,3
  559.  
  560.  
  561. DIBconvert1624@x3:
  562.  
  563.     add    esi,[esp+16+28]
  564.     add    edi,[esp+ 8+28]
  565.  
  566.     dec    edx
  567.     jne    DIBconvert1624@y
  568.  
  569.     pop    eax
  570.     pop    ebx
  571.     pop    ecx
  572.     pop    edx
  573.     pop    esi
  574.     pop    edi
  575.     pop    ebp
  576.  
  577.     ret
  578.  
  579. ; void DIBconvert_24_to_24(
  580. ;    void *dest,        [ESP+ 4]
  581. ;    ulong dest_pitch,    [ESP+ 8]
  582. ;    void *src,        [ESP+12]
  583. ;    ulong src_pitch,    [ESP+16]
  584. ;    ulong width,        [ESP+20]
  585. ;    ulong height);        [ESP+24]
  586. ;
  587. ;    this isn't THAT stupid a function!!
  588.  
  589. _DIBconvert_24_to_24:
  590.     push    edi
  591.     push    esi
  592.     push    edx
  593.     push    ecx
  594.     push    ebx
  595.     push    eax
  596.  
  597.     cld
  598.     mov    edx,[esp+24+24]
  599.  
  600.     mov    eax,[esp+20+24]
  601.     mov    esi,[esp+12+24]
  602.     mov    ebx,eax
  603.     mov    edi,[esp+ 4+24]
  604.     add    eax,eax
  605.     add    eax,ebx
  606.     mov    ebx,eax
  607.     shr    eax,2
  608.     and    ebx,3
  609.  
  610. DIBconvert2424@y:
  611.     push    esi
  612.     push    edi
  613.     mov    ecx,eax
  614.     rep    movsd
  615.     mov    ecx,ebx
  616.     rep    movsb
  617.     pop    edi
  618.     pop    esi
  619.     add    esi,[esp+16+24]
  620.     add    edi,[esp+ 8+24]
  621.  
  622.     dec    edx
  623.     jne    DIBconvert2424@y
  624.  
  625.     pop    eax
  626.     pop    ebx
  627.     pop    ecx
  628.     pop    edx
  629.     pop    esi
  630.     pop    edi
  631.  
  632.     ret
  633.  
  634. ;**********************************************************
  635. ;
  636. ; void DIBconvert_16_to_16(
  637. ;    void *dest,        [ESP+ 4]
  638. ;    ulong dest_pitch,    [ESP+ 8]
  639. ;    void *src,        [ESP+12]
  640. ;    ulong src_pitch,    [ESP+16]
  641. ;    ulong width,        [ESP+20]
  642. ;    ulong height);        [ESP+24]
  643. ;
  644. ;    this isn't THAT stupid a function!!
  645.  
  646. _DIBconvert_16_to_16:
  647.     push    edi
  648.     push    esi
  649.     push    edx
  650.     push    ecx
  651.     push    ebx
  652.     push    eax
  653.  
  654.     cld
  655.     mov    edx,[esp+24+24]
  656.  
  657.     mov    eax,[esp+20+24]
  658.     mov    esi,[esp+12+24]
  659.     mov    edi,[esp+ 4+24]
  660.  
  661. DIBconvert1616@y:
  662.     push    esi
  663.     push    edi
  664.     mov    ecx,eax
  665.     shr    ecx,1
  666.     rep    movsd
  667.     mov    ecx,eax
  668.     and    ecx,1
  669.     add    ecx,ecx
  670.     rep    movsb
  671.     pop    edi
  672.     pop    esi
  673.     add    esi,[esp+16+24]
  674.     add    edi,[esp+ 8+24]
  675.  
  676.     dec    edx
  677.     jne    DIBconvert1616@y
  678.  
  679.     pop    eax
  680.     pop    ebx
  681.     pop    ecx
  682.     pop    edx
  683.     pop    esi
  684.     pop    edi
  685.  
  686.     ret
  687.  
  688. ;******************************************************
  689. ;
  690. ; void DIBconvert_24_to_16(
  691. ;    void *dest,        [ESP+ 4]
  692. ;    ulong dest_pitch,    [ESP+ 8]
  693. ;    void *src,        [ESP+12]
  694. ;    ulong src_pitch,    [ESP+16]
  695. ;    ulong width,        [ESP+20]
  696. ;    ulong height);        [ESP+24]
  697.  
  698. _DIBconvert_24_to_16:
  699.     push    ebp
  700.     push    edi
  701.     push    esi
  702.     push    edx
  703.     push    ecx
  704.     push    ebx
  705.     push    eax
  706.  
  707.     mov    esi,[esp+12+28]
  708.     mov    edi,[esp+4+28]
  709.  
  710.     mov    ebp,[esp+20+28]
  711.     lea    eax,[ebp+ebp]
  712.     lea    ebx,[ebp+eax]
  713.     sub    [esp+8+28],eax
  714.     sub    [esp+16+28],ebx
  715.  
  716.     mov    edx,[esp+24+28]
  717. DIBconvert2416@y:
  718.     mov    ebp,[esp+20+28]
  719.     push    ebp
  720.     push    edx
  721.     shr    ebp,1
  722.     jz    DIBconvert2416@x2
  723. DIBconvert2416@x:
  724.     mov    eax,[esi+3]        ;u
  725.     add    esi,6            ;v
  726.  
  727.     mov    ebx,eax            ;u
  728.     mov    ecx,eax            ;v
  729.     shr    ebx,3            ;u
  730.     and    ecx,0000f800h        ;v
  731.     shr    eax,9            ;u
  732.     and    ebx,0000001fh        ;v
  733.     shr    ecx,6            ;u
  734.     and    eax,00007c00h        ;v
  735.     or    ebx,ecx            ;u
  736.     add    edi,4            ;v
  737.     or    ebx,eax            ;u
  738.  
  739.     mov    ecx,[esi-6]        ;v
  740.     mov    edx,ebx            ;u
  741.     mov    eax,ecx            ;v
  742.  
  743.     shl    edx,16            ;u
  744.     mov    ebx,ecx            ;v
  745.     shr    ebx,3            ;u
  746.     and    ecx,0000f800h        ;v
  747.     shr    eax,9            ;u
  748.     and    ebx,0000001fh        ;v
  749.     shr    ecx,6            ;u
  750.     and    eax,00007c00h        ;v
  751.     or    eax,ecx            ;u
  752.     or    edx,ebx            ;v
  753.     or    edx,eax            ;u
  754.     dec    ebp            ;v
  755.     mov    [edi-4],edx        ;u
  756.     jne    DIBconvert2416@x    ;v
  757. DIBconvert2416@x2:
  758.     pop    edx
  759.     pop    ebp
  760.     and    ebp,1
  761.     jz    DIBconvert2416@x3
  762.     mov    eax,[esi]
  763.     add    esi,3
  764.  
  765.     mov    ebx,eax
  766.     mov    ecx,eax
  767.     shr    ebx,3
  768.     and    ecx,0000f800h
  769.     shr    eax,9
  770.     and    ebx,0000001fh
  771.     shr    ecx,6
  772.     and    eax,00007c00h
  773.     or    ebx,ecx
  774.     or    ebx,eax
  775.     mov    [edi+0],bl
  776.     mov    [edi+1],bh
  777.     add    edi,2
  778. DIBconvert2416@x3:
  779.  
  780.     add    esi,[esp+16+28]
  781.     add    edi,[esp+ 8+28]
  782.  
  783.     dec    edx
  784.     jne    DIBconvert2416@y
  785.  
  786.     pop    eax
  787.     pop    ebx
  788.     pop    ecx
  789.     pop    edx
  790.     pop    esi
  791.     pop    edi
  792.     pop    ebp
  793.  
  794.     ret
  795.  
  796.     end
  797.